package com.wpp;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

/*
 * 使用PrepareddStatement实现对数据表的数据操作
 * 批量插入数据方式三:相当于添加一个高速缓存，类似于文件流
 *   ps.addBatch();//攒sql
 *
 *   if(i % 500 ==0){
 *       ps.executeBatch();//攒500条在执行
 *
 *       ps.clearBatch();//清空Batch
 *
 *   }
 *   批量操作只需要以上三步
 *   mysql服务器默认是关闭批处理的，我们需要通过一个参数，让mysql开启批处理，
 *       &&rewriteBatchedStatements=true  写在配置文件的url后面
 *
 * 批量插入数据的方式四:设置连接不允许自动提交数据
 * ps:因为数据库默认是提交的，在我们攒了500条执行的时候，就自动提交了，这里需要花费大量的时间，
 *   所以我们在获取连接之后，设置最后在统一一起提交，
 *   conn.setAutoCommit(false);//禁止自动提交
 *   conn.Commit();//统一提交
 *   最后在关闭资源
 *
 *
 * */
public class PrepareddStatementTest {


    @Test
    public void insertDataTest() {


        Connection connection = null;
        PreparedStatement pis = null;

        try {

            //获取配置信息
            //加载进流
            InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
            Properties properties = new Properties();
            properties.load(resourceAsStream);

            //读取属性
            String user = properties.getProperty("user");
            String password = properties.getProperty("password");
            String url = properties.getProperty("url");
            String driver = properties.getProperty("driver");

            //加载驱动
            Class.forName(driver);

            //获取数据库连接
            connection = DriverManager.getConnection(url, user, password);

            //预定义sql
            String sql = "insert into books(id,name,picturc)values(?,?,?)";

            //预编译sql,返回
            pis = connection.prepareStatement(sql);

            //填充占位符
            pis.setString(1, "java");
            pis.setString(2, "python");

            FileInputStream inputStream = new FileInputStream(new File("picture.jpg"));//这就是图片的具体位置
            //图片或者视频成功插入数据库,最大存储为4个G，最小为64kb
            pis.setBlob(3, inputStream);//首先需要一个流，加载图片的或者视频的


            //执行sql语句
            pis.execute();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            try {
                if (pis != null) {

                    pis.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (connection != null) {

                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        //关闭流


    }


}
